<?php
/**
 * Handle file uploads via regular form post (uses the $_FILES array)
 */
class qqUploadedFileForm {
	private $fileId;
	function __construct($fileId){
		$this->fileId = $fileId;
	}
	/**
	 * Save the file to the specified path
	 * @return boolean TRUE on success
	 */
	function save($path) {
		if(!move_uploaded_file($_FILES[$this->fileId]['tmp_name'], $path)){
			return false;
		}
		return true;
	}
	function getName() {
		return $_FILES[$this->fileId]['name'];
	}
	function getSize() {
		return $_FILES[$this->fileId]['size'];
	}
	function getType() {
		return $_FILES[$this->fileId]['type'];
	}
}

class qqFileUploader {
	private $allowedExtensions = array();
	private $sizeLimit = 10485760;
	private $file;
	private $fileId;
	function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760){
		$allowedExtensions = array_map("strtolower", $allowedExtensions);

		$this->allowedExtensions = $allowedExtensions;
		$this->sizeLimit = $sizeLimit;

		$this->checkServerSettings();
		$this->fileId = isset($_REQUEST["fileId"] ) ? $_REQUEST["fileId"]:null;
		//$this->fileId ='jUploadFile';
		if($this->fileId != null){
			$this->file = new qqUploadedFileForm($this->fileId );
		}
		else{
			$this->file = false;
		}
	}

	private function checkServerSettings(){
		$postSize = $this->toBytes(ini_get('post_max_size'));
		$uploadSize = $this->toBytes(ini_get('upload_max_filesize'));

		if ($postSize > $this->sizeLimit || $uploadSize > $this->sizeLimit){
			$size = max(1, $this->sizeLimit / 1024 / 1024) . 'M';
			die("{'error':'increase post_max_size and upload_max_filesize to $size'}");
		}
	}

	private function toBytes($str){
		$val = trim($str);
		$last = strtolower($str[strlen($str)-1]);
		switch($last) {
			case 'g': $val *= 1024;
			case 'm': $val *= 1024;
			case 'k': $val *= 1024;
		}
		return $val;
	}

	/**
	 * Returns array('success'=>true) or array('error'=>'error message')
	 */
	function handleUpload($uploadDirectory, $replaceOldFile = FALSE){
		if (!is_writable($uploadDirectory)){
			return array('error' => "Server error. Upload directory isn't writable.");
		}

		if (!$this->file){
			return array('error' => 'No files were uploaded.,fileId='.$this->fileId);
		}

		$size = $this->file->getSize();

		if ($size == 0) {
			return array('error' => 'File is empty,fileId='.$this->fileId
				.",name is=".$this->file->getName()
				.",error=".$_FILES[$this->fileId]["error"] );
		}

		if ($size > $this->sizeLimit) {
			return array('error' => 'File is too large');
		}

		$pathinfo = pathinfo($this->file->getName());
		$filename = $pathinfo['filename'];
		//$filename = md5(uniqid());
		$ext = $pathinfo['extension'];

		if($this->allowedExtensions && !in_array($this->file->getType(), $this->allowedExtensions)){
			$these = implode(', ', $this->allowedExtensions);
			return array('error' => 'File has an invalid extension, it should be one of '. $these . '.');
		}

		if(!$replaceOldFile){
			/// don't overwrite previous files that were uploaded
			while (file_exists($uploadDirectory . $filename . '.' . $ext)) {
				$filename .= rand(10, 1000);
			}
		}
		$rtInfo = array("path" => $uploadDirectory  );
		if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){
			$rtInfo['success'] = true;
			$rtInfo['fileName'] = $filename;
			$rtInfo['ext'] = $ext;
		} else {
			$rtInfo['error']=  'Could not save uploaded file.' .
                'The upload was cancelled, or server error encountered' ;
		}
		return $rtInfo;
	}
}

// list of valid extensions, ex. array("jpeg", "xml", "bmp")
$allowedExtensions = array('image/jpg','image/jpeg','image/png','image/pjpeg','image/gif','image/bmp','image/x-png');
// max file size in bytes
$sizeLimit = 10 * 1024 * 1024;
$method = isset($_REQUEST["method"] ) ? $_REQUEST["method"]:null;
$result = array();
if($method == "delete"){
	
	$fileName = isset($_REQUEST["fileName"] ) ? $_REQUEST["fileName"]:null;
	if($fileName == null){
		$result["error"]="no input put file";
	}else{
		$file = "../uploads/".$fileName;
		if (!unlink($file)){
			$result["error"]= ("Error deleting $file");
		}else{
			$result["success"]= ("Deleted $file");
		}
	}
}else{
	$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
	$result = $uploader->handleUpload('../uploads/');
}
// to pass data through iframe you will need to encode all html tags
//$result = array('error','upload fail');
echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);
